package io.springboot.jpa.examples.springbootjpaexamples.repository;

import io.springboot.jpa.examples.springbootjpaexamples.model.Person;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author yzc
 * @description
 * @date 2018/8/31
 */
public interface PersonRepository extends JpaRepository<Person, Long> {
    /**
     * 常规查询，根据属性名来查询
     * Spring Data JPA支持很多查询关键字，例如And Or Between Is Like Equals Top等
     * @param name
     * @return
     */
    List<Person> findByName(String name);

    List<Person> findByNameLike(String name);

    List<Person> findByNameAndAddress(String name, String address);

    /**
     * 限制查询结果数量。使用top first关键字来实现
     * @param name
     * @return
     */
    List<Person> findFirst10ByName(String name);

    List<Person> findTop30ByName(String name);

    /**
     * 这里使用的是Person中定义的@NamedQuery
     * @param age
     * @return
     */
//    List<Person> findByAge(int age);

    /**
     * 使用@Query查询
     * @param address
     * @return
     */
    @Query("select p from Person p where p.address=?1")
    List<Person> findByAddress(String address);

    /**
     * 使用命名参数查询
     * @param address
     * @return
     */
//    @Query("select '*' from Person where p.address=:address")
//    List<Person> findByAddress(@Param("addresss") String address);

    /**
     * 更新查询
     * @param name
     * @return
     */
    @Modifying
    @Transactional
    @Query("update Person p set p.name=?2 where p.id=?1")
    int setName(long id, String name);

    /**
     * 基于准则的查询Specification，即Criteria查询。这里不进行详述。
     */

    /**
     * 排序和分页
     * @param name
     * @param sort
     * @return
     */
    List<Person> findByName(String name, Sort sort);
    Page<Person> findByName(String name, Pageable pageable);

    /**
     * Spring Data JPS还支持自定义Repository查询。这里不进行详述。
     */
}
